// 继承

// 字面量写法  缺点：多个构造函数的原型对象指向同一个对象，会导致修改时，都修改，应该让每个构造函数的原型对象各自独立
const Person ={
    eyse: 2,
    eat(){
       return '我会吃饭'
    }
}


// 原型继承
Man.prototype = Person
Woman.prototype = Person

function Man(){}
function Woman(){}

const man = new Man()
console.log(man.eat()) // 我会吃饭
console.log(man.eyse)// 2

const woman = new Man()
console.log(woman.eat()) // 我会吃饭
console.log(woman.eyse) // 2

// 对象不独立 ：  向 Woman 里面 的原型加方法，因为他们指向同一个对象，会直接加到  父类  Person 里面，所以 man 也可以使用此方法
Woman.prototype.body = function(){
    return '宝贝'
}
console.log(man.body()) // 宝贝






// 解决：字面量写法的缺陷
function Person2(){
    this.eyse = 2
}
// 公共方法
Person2.prototype.eat = function(){
    return '我会吃饭'
}

function Man2(){}
function Woman2(){}

//  解决 对象不独立的问题 ： 构造函数实例化对象继承
// 构造函数实例化对象继承
Man2.prototype = new Person2()
Woman2.prototype = new Person2()

// 创建各自的构造函数
Man2.prototype.constructor = Man2
Woman2.prototype.constructor = Woman2

const man2 = new Man()
console.log(man2.eat()) // 我会吃饭
console.log(man2.eyse)// 2

const woman2 = new Man()
console.log(woman2.eat()) // 我会吃饭
console.log(woman2.eyse) // 2

Woman2.prototype.body = function(){
    return '宝贝'
}
// console.log(Man2.body()) // 报错  证明 对象已经互不相通了


/**总结
 * 1.创建父级构造函数
 * 2.将所有公共的成员放到父级的原型对象上
 * 3.将 子级构造函数的原型对象  指向  父级构造函数  创建的  实例对象中
 */

